/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ws08;

import com.hp.hpl.jena.db.DBConnection;
import com.hp.hpl.jena.db.IDBConnection;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.QueryFactory;
import com.hp.hpl.jena.query.ResultSet;
import com.hp.hpl.jena.query.ResultSetFormatter;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.ModelMaker;
import com.hp.hpl.jena.sparql.core.ResultBinding;
import com.hp.hpl.jena.sparql.engine.ResultSetStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.List;
import java.util.StringTokenizer;
import java.util.Vector;
import jena.version;

/**
 *
 * @author Filipe
 */
public class QueryEngine {
    // database URL
    private String M_DB_URL = "jdbc:mysql://localhost:3309/wsdb";
    // User name
    private String M_DB_USER = "ws";
    // Password
    private String M_DB_PASSWD = "ws";
    // Database engine name
    private String M_DB = "MySQL";
    // JDBC driver
    private String M_DBDRIVER_CLASS = "com.mysql.jdbc.Driver";
    private Model nmModel;
    private String inputFileName = "JavadocOntologia.owl";    // Properties
    private String URI = "http://www.owl-ontologies.com/javadoc_renteBK2008WS.owl#";
    private String PREFIX = "PREFIX nosso: <" + URI + ">";
    private String queryTudo = PREFIX +
            "SELECT  ?file ?Autor ?caminho ?tamanho ?classe ?metodo ?value ?param ?var ?var_type " +
            //   "SELECT * " + 

            "WHERE { " +
            " ?f nosso:Nome_ficheiro ?file ;" +
            "  nosso:temClasse ?classe ;" +
            " nosso:Caminho ?caminho ;" +
            " nosso:Tamanho ?tamanho ." +
            " ?c nosso:Nome_da_classe ?classe ;" +
            " nosso:temMetodo ?metodo ." +
            " ?o nosso:Nome_do_metodo ?metodo ;" +
            " nosso:temParametros ?param ;" +
            " nosso:Valor_de_retorno ?value ." +
            " ?c nosso:Autor ?Autor ." +
            " ?p nosso:Nome_param_entrada ?param ." +
            //" ?v nosso:Nome_var ?var ;" +
            //"  nosso:Tipo_var ?var_type ." +
            //" ?c nosso:temVar ?var ." +

            //  " ?s nosso:Desde_versao ?since ." +
            //    " ?v nosso:Versao ?versao ." +
            //   " ?s2 nosso:Ver_tambem ?see ." +
            //  "FILTER regex(str(?metodo), 'copyInto')" +
            "FILTER regex(str(?Autor), 'Lee')" +
            //   "FILTER regex(str(?versao), '1.0')" +
            "}";
    private String queryFicheiro = PREFIX +
            "SELECT ?file ?caminho ?tamanho ?classe ?data " +
            "WHERE {" +
            " ?f nosso:Nome_ficheiro ?file ;" +
            "  nosso:temClasse ?classe ;" +
            " nosso:Caminho ?caminho ;" +
            " nosso:Tamanho ?tamanho ;" +
            " nosso:Data_de_modificacao?data";
    private String queryClasse = PREFIX +
            "SELECT ?classe ?Autor ?var ?metodo ?var_type ?vrs ?since ?descricao " +
            "WHERE {" +
            " ?c nosso:Nome_da_classe ?classe ;" +
            " nosso:temMetodo ?metodo ;" +
            " nosso:Autor ?Autor ;" +
            " nosso:Versao ?vrs ;" +
            " nosso:Desde_versao ?since ;" +
            //          " nosso:Descricao ?descricao ;"+
            //          " nosso:Ver_tambem ?vt ;" +
            //          "nosso:Throws_exception ?exception ;" +
            " nosso:temVar ?var ." +
            " ?v nosso:Nome_var ?var ;" +
            " nosso:Tipo_var ?var_type .";    //"}";
    private String queryMetodo = PREFIX +
            "SELECT ?metodo ?return ?param ?exc " +
            "WHERE {" +
            " ?o nosso:Nome_do_metodo ?metodo ;" +
            " nosso:temParametros ?param ;" +
            " nosso:Throws_exception ?exc ;" +
            " nosso:Valor_de_retorno ?return .";
    private String queryMetodo1 = PREFIX +
            " SELECT ?Nome_do_metodo ?Nome_ficheiro " +
            " WHERE {" +
            " OPTIONAL {?x nosso:Nome_do_metodo ?Nome_do_metodo} ." +
            " OPTIONAL {?x nosso:temParametros ?temParametros} ." +
            " OPTIONAL {?x nosso:Throws_exception ?Throws_exception} ." +
            " OPTIONAL {?x nosso:Valor_de_retorno ?Valor_de_retorno} ." +
            " OPTIONAL {?x nosso:Deprecated ?Deprecated} . " +
            " OPTIONAL {?x nosso:Descricao_do_metodo ?Descricao_do_metodo} . " +
            " OPTIONAL {?y nosso:Nome_ficheiro ?Nome_ficheiro} .";
    private QueryExecution qe;

    public QueryEngine() {
        try {
            // load the the driver class
            Class.forName(M_DBDRIVER_CLASS);

            // create a database connection
            IDBConnection conn = new DBConnection(M_DB_URL, M_DB_USER, M_DB_PASSWD, M_DB);

            // create a model maker with the given connection parameters
            ModelMaker maker = ModelFactory.createModelRDBMaker(conn);

            //or open a previously created named model
            nmModel = maker.openModel("MyWSModel");
        } catch (Exception ex) {
            // ex.printStackTrace();
            System.out.println("NO DB");
        }
    }

    public Hashtable<String, Vector<String>> interpretaInput(int type, String input) {

        Hashtable<String, Vector<String>> data = new Hashtable();
        int count = 0;
        StringTokenizer tokenizer = new StringTokenizer(input);
        String[] tokens = new String[tokenizer.countTokens()];
        System.out.println("CHEGOU CA: " + input + " tokens: " + tokenizer.countTokens());
        if (type == 0) {
            while (tokenizer.hasMoreTokens()) {
                tokens[count] = tokenizer.nextToken();
                count++;
                System.out.println(count + " tokens!");
            }
            if (tokens[0].startsWith("?")) {
                String tipoPesquisa = tokens[0].substring(1).trim().toLowerCase();
                System.out.println("Tipo Pesquisa **" + tipoPesquisa + "**");
                if (tokens.length == 2) {
                    //faz pesquisa em "tipoPesquisa" com o unico token
                    System.out.println(" faz pesquisa em " + tipoPesquisa + " com o unico token");
                    data = pesquisaTematica(tipoPesquisa, tokens[1], "");

                } else if (tokens.length > 2) {
                    //faz pesquisa em "tipoPesquisa" com mais de 1 token
                    System.out.println("faz pesquisa em " + tipoPesquisa + " com mais de 1 token");
                }
            } else {
                System.out.println("faz pesquisa NORMAL");
                if (tokens.length == 1) {
                    //faz pesquisa em "tipoPesquisa" com o unico token
                    data = pesquisaGlobal(tokens[0], "");
                    System.out.println(" faz pesquisa NORMAL com o unico token");
                } else if (tokens.length > 1) {
                    //faz pesquisa em "tipoPesquisa" com mais de 1 token
                    data = pesquisaGlobalMulti(tokens);
                    System.out.println("faz pesquisa NORMAL com mais de 1 token");
                }
            }
        } else if (type == 1) {
            //pesquisa mais autor
            tokenizer = new StringTokenizer(input, ";");
            //if (tokenizer.countTokens() == 1) {
            String s = tokenizer.nextToken().trim();
            data = pesquisaMaisDoAutor(s);
        //}
        } else if (type == 2) {
            //package
            data = pesquisaMesmaPackage(input);
        } else if (type == 3) {
            //pesquisa classes em ficheiro
            data = pesquisaClassesInFile(input);
        } else if (type == 4) {
            //pesquisa classes em ficheiro
            data = pesquisaMetodosInFile(input);
        }
        return data;
    }

    public Hashtable<String, Vector<String>> pesquisaGlobal(String input, String idFile) {
        Hashtable<String, Vector<String>> data = new Hashtable();

        data = pesquisaFicheiro(data, 10, "Nome_ficheiro", 1, input, idFile);
        data = pesquisaClasse(data, 11, "Nome_da_classe", 1, input, idFile);
        data = pesquisaMetodo(data, 12, "Nome_do_metodo", 1, input, idFile);
        data = pesquisaClasse(data, 13, "Descricao", 1, input, idFile);
        data = pesquisaMetodo(data, 14, "Descricao_do_metodo", 1, input, idFile);
        data = pesquisaClasse(data, 15, "Autor", 1, input, idFile);
        data = pesquisaMetodo(data, 16, "Valor_de_retorno", 1, input, idFile);
        data = pesquisaMetodo(data, 17, "Throws_exception", 1, input, idFile);
        data = pesquisaMetodo(data, 18, "temParametros", 2, input, idFile);
        data = pesquisaClasse(data, 19, "Versao", 1, input, idFile);
        data = pesquisaFicheiro(data, 20, "Tamanho", 1, input, idFile);
        data = pesquisaFicheiro(data, 21, "Data_de_modificacao", 1, input, idFile);



        return data;
    }

    public Vector<String> getFileInfos(String id, int tipo) {
        Vector<String> ret = new Vector();
        ResultSet rs;

        if (tipo == 0) {
            String query = PREFIX +
                    "SELECT DISTINCT ?tamanho ?data ?Autor ?pa " +
                    " WHERE {" +
                    " ?f nosso:Nome_ficheiro ?file ;" +
                    " nosso:Tamanho ?tamanho ;" +
                    " nosso:Data_de_modificacao ?data ." +
                    " ?f nosso:temClasse ?c . " +
                    " OPTIONAL{ ?c nosso:Autor ?Autor }." +
                    " OPTIONAL{ ?c nosso:hasPackage ?p }." +
                    " OPTIONAL{ ?p nosso:package_name ?pa }." +
                    " FILTER regex(str(?f), '" + id + "', 'i' ) " +
                    " }";
            rs = executaQuery(query, nmModel);
            ret = guardaDadosQueryDetalhes(0, rs);
        } else if (tipo == 1) {
            String query = PREFIX +
                    " SELECT DISTINCT ?Nome_da_classe ?Autor ?Descricao ?Deprecated ?pa ?Throws_exception ?vrs ?Ver_tambem ?Desde_versao " +
                    " WHERE {" +
                    " ?idClasse nosso:Nome_da_classe ?Nome_da_classe ;" +
                    " OPTIONAL { ?idClasse nosso:Autor ?Autor } ." +
                    " OPTIONAL { ?idClasse nosso:Versao ?vrs } ." +
                    " OPTIONAL { ?idClasse nosso:Desde_versao ?since } ." +
                    " OPTIONAL { ?idClasse  nosso:hasPackage ?p } . " +
                    " OPTIONAL { ?p nosso:package_name ?pa } ." +
                    " OPTIONAL { ?idClasse nosso:Deprecated ?Deprecated } ." +
                    " OPTIONAL { ?idClasse nosso:Desde_versao ?Desde_versao } ." +
                    " OPTIONAL { ?idClasse nosso:Descricao ?Descricao } ." +
                    " OPTIONAL { ?idClasse nosso:Throws_exception ?Throws_exception } ." +
                    " OPTIONAL { ?idClasse nosso:Ver_tambem ?Ver_tambem } ." +
                    " FILTER regex(str(?idClasse), '" + id + "', 'i' ) " +
                    " }";
            rs = executaQuery(query, nmModel);
            ret = guardaDadosQueryDetalhes(1, rs);
        } else if (tipo == 2) {
            System.out.println("ID: " + id);
            String query = PREFIX +
                    " SELECT DISTINCT ?Nome_do_metodo ?Descricao ?Valor_de_retorno ?pa ?Deprecated ?Throws_exception " +
                    " WHERE {" +
                    " ?idMetodo nosso:Nome_do_metodo ?Nome_do_metodo ." +
                    " OPTIONAL { ?idMetodo nosso:Throws_exception ?Throws_exception } ." +
                    " OPTIONAL { ?idMetodo nosso:Deprecated ?Deprecated } ." +
                    " OPTIONAL { ?idMetodo nosso:Descricao_do_metodo ?Descricao } ." +
                    " OPTIONAL { ?idMetodo nosso:Valor_de_retorno ?Valor_de_retorno } ." +
                    " OPTIONAL { ?idMetodo nosso:temParametros ?p } . " +
                    " OPTIONAL { ?p nosso:Nome_param_entrada ?pa } ." +
                    " FILTER regex(str(?idMetodo), '" + id + "', 'i' ) " +
                    " }";
            rs = executaQuery(query, nmModel);
            ret = guardaDadosQueryDetalhes(2, rs);
        }

        return ret;
    }

    private Vector<String> guardaDadosQueryDetalhes(int type, ResultSet rs) {
        StringBuilder res = new StringBuilder();
        Vector<String> ret = new Vector();
        List<String> vars = rs.getResultVars();
        String valor;
//        for (String string : vars) {
//            System.out.println("\nVARS : " + string);
//        }
        while (rs.hasNext()) {
            ResultBinding next = (ResultBinding) rs.next();
            for (String nomeColuna : vars) {
                try {
                    valor = next.get(nomeColuna).toString();
                } catch (Exception e) {
                    valor = "vazio";
                }
                if (valor.length() == 0) {
                    valor = "vazio";
                }
                res.append(valor + "&");
            }
            ret.add(res.toString());
            res = new StringBuilder();
        }
        qe.close();
        return ret;
    }

    private Vector<String> guardaDadosQueryPesquisa(String nomeColuna, ResultSet rs, int type) {
        String res = "";
        Vector<String> stuff = new Vector<String>();
        List<String> l = rs.getResultVars();
//        for (String string : l) {
//            System.out.println("VARS : " + string);
//        }
        while (rs.hasNext()) {
            ResultBinding next = (ResultBinding) rs.next();
            if (nomeColuna.length() != 0) {
                res += next.get(nomeColuna).toString() + " @ ";
            }

            if (type == 0) {
                // guarda dados da pesquisa normal
                res += next.get("Nome_ficheiro").toString();
                res += "%" + next.get("Caminho").toString();
                res += "%" + next.get("Ficheiro").toString();
            } else if (type == 1) {
                //guarda dados classes em Ficheiro
                res += next.get("Nome_da_classe").toString();
                res += "%" + next.get("idClasse").toString();
            } else if (type == 2) {
                //guarda dados metodos em Ficheiro
                res += next.get("Nome_do_metodo").toString();
                res += "%" + next.get("idMetodo").toString();
            }

            stuff.add(res);
            res = "";
        }

        qe.close();
        return stuff;
    }

    private Hashtable<String, Vector<String>> pesquisaClassesInFile(String input) {
        ResultSet rs;
        String query = "";
        Hashtable<String, Vector<String>> data = new Hashtable();
        query = PREFIX +
                " SELECT DISTINCT ?Nome_da_classe ?idClasse " +
                " WHERE {" +
                " ?idFile nosso:temClasse ?idClasse . " +
                " ?idClasse nosso:Nome_da_classe ?Nome_da_classe . " +
                " FILTER regex(str(?idFile), '" + input + "', 'i' ) " +
                " }";

        rs = executaQuery(query, nmModel);
        data.put("Classes", guardaDadosQueryPesquisa("", rs, 1));

        return data;
    }

    private Hashtable<String, Vector<String>> pesquisaGlobalMulti(String[] tokens) {
        Hashtable<String, Vector<String>> data = new Hashtable();
        Hashtable<String, Vector<String>> temp1 = new Hashtable();
        String str = "";
        String[] aux;
        Vector<String> vectorAux;
        Vector<String> vectorIDs = new Vector<String>();
        for (String string : tokens) {
            str += string + " ";
        }
        str = str.trim();
        data = pesquisaGlobal(str, "");


        temp1 = pesquisaGlobal(tokens[0], "");
        Enumeration<String> e = temp1.keys();
        String keyActual;
        while (e.hasMoreElements()) {
            keyActual = e.nextElement();
            vectorAux = temp1.get(keyActual);
            data.put("91" + keyActual, vectorAux);
            for (String string : vectorAux) {
                aux = string.split("%");
                vectorIDs.add(aux[aux.length - 1]);
            }
        }
        temp1 = pesquisaGlobal(tokens[1], "");
        e = temp1.keys();
        while (e.hasMoreElements()) {
            keyActual = e.nextElement();
            vectorAux = temp1.get(keyActual);
            data.put("92" + keyActual, vectorAux);
        }

        vectorIDs = removeDuplicates(vectorIDs);
        for (String string : vectorIDs) {
            temp1 = pesquisaGlobal(tokens[1], string);
            e = temp1.keys();
            while (e.hasMoreElements()) {
                keyActual = e.nextElement();
                vectorAux = temp1.get(keyActual);
                data.put("81" + keyActual, vectorAux);
            }
        }
        return data;
    }

    private Vector removeDuplicates(Vector v) {
        if (v != null) {
            Vector vNew = new Vector();
            for (int i = 0; i <
                    v.size(); i++) {
                if (!vNew.contains(v.get(i))) {
                    vNew.addElement(v.get(i));
                }

            }
            return vNew;
        }

        return v;
    }

    private Hashtable<String, Vector<String>> pesquisaMaisDoAutor(String input) {
        ResultSet rs;
        String query = "";
        Hashtable<String, Vector<String>> data = new Hashtable();
        query = PREFIX +
                " SELECT DISTINCT ?Nome_ficheiro ?Caminho ?Ficheiro" +
                " WHERE {" +
                " ?Ficheiro nosso:Nome_ficheiro ?Nome_ficheiro . " +
                " ?c nosso:Nome_da_classe ?Nome_da_classe ." +
                " ?Ficheiro nosso:temClasse ?c ." +
                " ?Ficheiro nosso:Caminho ?Caminho . " +
                " ?c nosso:Autor ?Autor ." +
                " FILTER regex(str(?Autor), '" + input + "', 'i' ) " +
                " }";

        rs = executaQuery(query, nmModel);
        data.put("Autor", guardaDadosQueryPesquisa("", rs, 0));

        return data;
    }

    private Hashtable<String, Vector<String>> pesquisaMesmaPackage(String input) {
        ResultSet rs;
        String query = "";
        Hashtable<String, Vector<String>> data = new Hashtable();
        query = PREFIX +
                " SELECT DISTINCT ?Nome_ficheiro ?Caminho ?Ficheiro" +
                " WHERE {" +
                " ?Ficheiro nosso:Nome_ficheiro ?Nome_ficheiro . " +
                " ?c nosso:Nome_da_classe ?Nome_da_classe ." +
                " ?Ficheiro nosso:temClasse ?c . " +
                " ?Ficheiro nosso:Caminho ?Caminho . " +
                " ?c nosso:hasPackage ?p ." +
                " ?p nosso:package_name ?pa ." +
                " FILTER regex(str(?pa), '" + input + "', 'i' ) " +
                " }";

        rs = executaQuery(query, nmModel);
        data.put("Package", guardaDadosQueryPesquisa("", rs, 0));

        return data;
    }

    private Hashtable<String, Vector<String>> pesquisaMetodo(Hashtable<String, Vector<String>> data, int id, String campo, int type, String token, String idFile) {
        ResultSet rs;
        String query;

        if (type == 1) {
            query = PREFIX +
                    " SELECT DISTINCT ?Nome_do_metodo ?Nome_ficheiro ?Caminho ?Ficheiro  " +
                    " WHERE {" +
                    " ?metodo nosso:Nome_do_metodo ?Nome_do_metodo . " +
                    " ?metodo nosso:" + campo + " ?" + campo + " . " +
                    " FILTER regex(str(?" + campo + "),'" + token + "', 'i') " +
                    " ?classe nosso:temMetodo ?metodo . " +
                    " ?Ficheiro nosso:temClasse ?classe . " +
                    " ?Ficheiro nosso:Nome_ficheiro ?Nome_ficheiro . " +
                    " ?Ficheiro nosso:Caminho ?Caminho . ";
            if (idFile.length() != 0) {
                query += " FILTER regex(str(?Ficheiro), '" + idFile + "', 'i' ) ";
            }
            query += " } ";
        } else {
            query = PREFIX +
                    "SELECT DISTINCT ?Nome_do_metodo ?Nome_ficheiro ?Caminho ?Ficheiro  " +
                    " WHERE {" +
                    " ?idMetodo nosso:Nome_do_metodo ?Nome_do_metodo ." +
                    " ?idMetodo nosso:temParametros ?p . " +
                    " ?p nosso:Nome_param_entrada ?pa ." +
                    " FILTER regex(str(?pa), '" + token + "', 'i' ) " +
                    " ?classe nosso:temMetodo ?idMetodo . " +
                    " ?Ficheiro nosso:temClasse ?classe . " +
                    " ?Ficheiro nosso:Nome_ficheiro ?Nome_ficheiro . " +
                    " ?Ficheiro nosso:Caminho ?Caminho . ";
            if (idFile.length() != 0) {
                query += " FILTER regex(str(?Ficheiro), '" + idFile + "', 'i' ) ";
            }
            query += " } ";
        }

        rs = executaQuery(query, nmModel);
        data.put(id + campo, guardaDadosQueryPesquisa("Nome_do_metodo", rs, 0));

        return data;
    }

    private Hashtable<String, Vector<String>> pesquisaClasse(Hashtable<String, Vector<String>> data, int id, String campo, int type, String token, String idFile) {
        ResultSet rs;
        String query = "";
        if (type == 1) {
            query = PREFIX +
                    " SELECT DISTINCT ?Nome_da_classe ?Nome_ficheiro ?Caminho ?Ficheiro " +
                    " WHERE {" +
                    " ?classe nosso:Nome_da_classe ?Nome_da_classe . " +
                    " ?classe nosso:" + campo + " ?" + campo + " . " +
                    " FILTER regex(str(?" + campo + "),'" + token + "', 'i') " +
                    " ?Ficheiro nosso:temClasse ?classe . " +
                    " ?Ficheiro nosso:Nome_ficheiro ?Nome_ficheiro . " +
                    " ?Ficheiro nosso:Caminho ?Caminho . ";
            if (idFile.length() != 0) {
                query += " FILTER regex(str(?Ficheiro), '" + idFile + "', 'i' ) ";
            }
            query += " } ";
        }

        rs = executaQuery(query, nmModel);
        data.put(id + campo, guardaDadosQueryPesquisa("Nome_da_classe", rs, 0));

        return data;
    }

    private Hashtable<String, Vector<String>> pesquisaFicheiro(Hashtable<String, Vector<String>> data, int id, String campo, int type, String token, String idFile) {
        ResultSet rs;
        String query = "";
        if (type == 1) {
            query = PREFIX +
                    PREFIX +
                    " SELECT DISTINCT ?Nome_ficheiro ?Caminho ?Ficheiro " +
                    " WHERE { " +
                    " ?Ficheiro nosso:Nome_ficheiro ?Nome_ficheiro ; " +
                    " nosso:" + campo + " ?" + campo + " ; " +
                    " nosso:Caminho ?Caminho . " +
                    " FILTER regex(str(?" + campo + "), '" + token + "', 'i' ) ";

            if (idFile.length() != 0) {
                query += " FILTER regex(str(?Ficheiro), '" + idFile + "', 'i' ) ";
            }
            query += " } ";
        }

        rs = executaQuery(query, nmModel);
        data.put(id + campo, guardaDadosQueryPesquisa("", rs, 0));

        return data;
    }

    private Hashtable<String, Vector<String>> pesquisaMetodosInFile(String input) {
        ResultSet rs;
        String query = "";
        Hashtable<String, Vector<String>> data = new Hashtable();
        query =
                PREFIX +
                " SELECT DISTINCT ?Nome_do_metodo ?idMetodo  " +
                " WHERE {" +
                " ?idFile nosso:temClasse ?idClasse ." +
                " ?idClasse nosso:temMetodo ?idMetodo ." +
                " ?idMetodo nosso:Nome_do_metodo ?Nome_do_metodo ." +
                " FILTER regex(str(?idFile), '" + input + "', 'i' ) " +
                " }";

        rs =
                executaQuery(query, nmModel);
        data.put("Metodos", guardaDadosQueryPesquisa("", rs, 2));

        return data;
    }

    private Hashtable<String, Vector<String>> pesquisaTematica(String tipoPesquisa, String string, String idFile) {
        Hashtable<String, Vector<String>> data = new Hashtable();
        if (tipoPesquisa.equals("ficheiro")) {
            System.out.println("PESQUISA TEMATICA FICHEIRO");
            data = pesquisaFicheiro(data, 1, "Nome_ficheiro", 1, string, idFile);
            data = pesquisaFicheiro(data, 2, "Tamanho", 1, string, idFile);
            data = pesquisaFicheiro(data, 3, "Data_de_modificacao", 1, string, idFile);
        } else if (tipoPesquisa.equals("método") || tipoPesquisa.equals("metodo") || tipoPesquisa.equals("method")) {
            System.out.println("PESQUISA TEMATICA METODO");
            data = pesquisaMetodo(data, 1, "Nome_do_metodo", 1, string, idFile);
            data = pesquisaMetodo(data, 2, "Descricao_do_metodo", 1, string, idFile);
            data = pesquisaMetodo(data, 3, "Valor_de_retorno", 1, string, idFile);
            data = pesquisaMetodo(data, 4, "Throws_exception", 1, string, idFile);
            data = pesquisaMetodo(data, 5, "temParametros", 2, string, idFile);
        } else if (tipoPesquisa.equals("classe") || tipoPesquisa.equals("class")) {
            System.out.println("PESQUISA TEMATICA CLASSE");
            data = pesquisaClasse(data, 1, "Nome_da_classe", 1, string, idFile);
            data = pesquisaClasse(data, 2, "Descricao", 1, string, idFile);
            data = pesquisaClasse(data, 3, "Autor", 1, string, idFile);
            data = pesquisaClasse(data, 4, "Versao", 1, string, idFile);
        }
        return data;
    }

    private ResultSet executaQuery(String s, Model m) {
        com.hp.hpl.jena.query.Query query = QueryFactory.create(s);
        // Execute the query and obtain results
        qe =
                QueryExecutionFactory.create(s, m);
        ResultSetStream rs = (ResultSetStream) qe.execSelect();
        //ResultSetFormatter.out(System.out, rs);

        //qe.close();

        return rs;
    }

    private ResultSet executaQueryOUT(String s, Model m) {
        com.hp.hpl.jena.query.Query query = QueryFactory.create(s);
        // Execute the query and obtain results
        qe = QueryExecutionFactory.create(s, m);
        ResultSetStream rs = (ResultSetStream) qe.execSelect();
        ResultSetFormatter.out(System.out, rs);

        //qe.close();

        return rs;
    }
}
